home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1996 July: Mac OS SDK / Dev.CD Jul 96 SDK / Dev.CD Jul 96 SDK1.toast / Development Kits (Disc 1) / Apple Game Sprockets / Examples / SoundSprocketTest / TS3TestLoLevel.c < prev    next >
Encoding:
C/C++ Source or Header  |  1996-05-16  |  46.0 KB  |  1,775 lines  |  [TEXT/CWIE]

  1. /*
  2.  *    File:        TS3TestLoLevel.c
  3.  *    Author:        Dan Venolia
  4.  *
  5.  *    Copyright © 1996 Apple Computer, Inc.
  6.  */
  7.  
  8. #include <assert.h>
  9. #include <math.h>
  10. #include <string.h>
  11.  
  12. #include <Dialogs.h>
  13. #include <Fonts.h>
  14. #include <Menus.h>
  15. #include <Timer.h>
  16.  
  17. #include "TS3Menu.h"
  18. #include "TS3Message.h"
  19. #include "TS3Resource.h"
  20. #include "TS3Sound.h"
  21. #include "TS3TestLoLevel.h"
  22. #include "TS3Utils.h"
  23. #include "TS3Window.h"
  24.  
  25. #include "SoundSprocket.h"
  26.  
  27.  
  28. typedef struct TTestLoLevelData {
  29.     float            duration;
  30.     
  31.     UInt32            cpuLoad1;
  32.     UInt32            cpuLoad2;
  33.     Boolean            cpuLoadRange;
  34.     
  35.     UInt32            medium;
  36.     
  37.     float            humidity1;
  38.     float            humidity2;
  39.     Boolean            humidityRange;
  40.     
  41.     float            roomSize1;
  42.     float            roomSize2;
  43.     Boolean            roomSizeRange;
  44.     
  45.     float            roomReflectivity1;
  46.     float            roomReflectivity2;
  47.     Boolean            roomReflectivityRange;
  48.     
  49.     float            reverbAttenuation1;
  50.     float            reverbAttenuation2;
  51.     Boolean            reverbAttenuationRange;
  52.     
  53.     UInt32            sourceMode;
  54.     
  55.     float            referenceDistance1;
  56.     float            referenceDistance2;
  57.     Boolean            referenceDistanceRange;
  58.     
  59.     float            coneAngleDeg1;
  60.     float            coneAngleDeg2;
  61.     Boolean            coneAngleDegRange;
  62.     
  63.     float            coneAttenuation1;
  64.     float            coneAttenuation2;
  65.     Boolean            coneAttenuationRange;
  66.     
  67.     float            elevationDeg1;
  68.     float            elevationDeg2;
  69.     Boolean            elevationDegRange;
  70.     
  71.     float            azimuthDeg1;
  72.     float            azimuthDeg2;
  73.     Boolean            azimuthDegRange;
  74.     
  75.     float            distance1;
  76.     float            distance2;
  77.     Boolean            distanceRange;
  78.     
  79.     float            projectionAngleDeg1;
  80.     float            projectionAngleDeg2;
  81.     Boolean            projectionAngleDegRange;
  82.     
  83.     float            sourceVelocity1;
  84.     float            sourceVelocity2;
  85.     Boolean            sourceVelocityRange;
  86.     
  87.     float            listenerVelocity1;
  88.     float            listenerVelocity2;
  89.     Boolean            listenerVelocityRange;
  90.     
  91.     float            coneAngleCos1;
  92.     float            coneAngleCos2;
  93.     
  94.     float            elevation1;
  95.     float            elevation2;
  96.     
  97.     float            azimuth1;
  98.     float            azimuth2;
  99.     
  100.     float            projectionAngle1;
  101.     float            projectionAngle2;
  102. } TTestLoLevelData;
  103.  
  104.  
  105. static MenuHandle                gTestLoLevelPresetMenu            = NULL;
  106. static DialogPtr                gTestLoLevelDialog                = NULL;
  107. static UserItemUPP                gTestLoLevelProgressUserItem    = NULL;
  108. static UInt32                    gTestLoLevelCPULoadLimit;
  109. static TTestLoLevelData            gTestLoLevelData;
  110.  
  111. static UnsignedWide                gTestLoLevelCycleStart;
  112. static float                    gTestLoLevelInterpolant            = 0.0;
  113.  
  114.  
  115. static WindowMethodPtr TestLoLevel_MetaHandler(
  116.     WindowMethod        inMethod);
  117.  
  118. static void TestLoLevel_GetSleep(
  119.     WindowPtr            inWindow,
  120.     UInt32*                outSleep);
  121.  
  122. static void TestLoLevel_ConsumeEvent(
  123.     WindowPtr            inWindow,
  124.     const EventRecord*    inEvent,
  125.     Boolean*            outConsumed);
  126.  
  127. static void TestLoLevel_Update(
  128.     WindowPtr            inWindow);
  129.  
  130. static void TestLoLevel_Activate(
  131.     WindowPtr            inWindow);
  132.  
  133. static void TestLoLevel_Deactivate(
  134.     WindowPtr            inWindow);
  135.  
  136. static pascal void TestLoLevel_ProgressUserItem(
  137.     DialogPtr            inDialog,
  138.     short                inItem);
  139.  
  140. static void TestLoLevel_Interpolate(
  141.     void);
  142.  
  143. static float TestLoLevel_DoInterpolate(
  144.     float                inWhere,
  145.     float                inVal0,
  146.     float                inVal1,
  147.     Boolean                inIsRange);
  148.  
  149. static void TestLoLevel_DeriveData(
  150.     void);
  151.  
  152. static void TestLoLevel_SetDialogFields(
  153.     void);
  154.  
  155. static void TestLoLevel_GetDialogFields(
  156.     void);
  157.  
  158.  
  159. /* =============================================================================
  160.  *        TestLoLevel_Init (external)
  161.  *
  162.  *    Initializes our thing.
  163.  * ========================================================================== */
  164. void TestLoLevel_Init(
  165.     void)
  166. {
  167.     OSStatus            err;
  168.     TEHandle            textEdit;
  169.     FontInfo            fontInfo;
  170.     short                itemType;
  171.     Handle                itemHandle;
  172.     Rect                itemBounds;
  173.     Str255                str;
  174.     
  175.     // Make sure we didn't mess up the dialog items
  176.     assert(kLoLevelItem_COUNT == kLoLevelItem_ExpectedCOUNT);
  177.     
  178.     // Grab the maximum CPU load limit value
  179.     gTestLoLevelCPULoadLimit = 999;
  180.     err = SSpGetCPULoadLimit(&gTestLoLevelCPULoadLimit);
  181.     Message_CheckError(err, "TestLoLevel_Init", "SSpGetCPULoadLimit");
  182.     
  183.     //• TODO: Read in gTestLoLevelData from preferences
  184.     
  185.     // Grab the menu
  186.     gTestLoLevelPresetMenu = GetMenu(kMenuID_LoLevelPreset);
  187.     
  188.     // Grab the dialog
  189.     gTestLoLevelDialog = GetNewDialog(kDlogID_LoLevel, NULL, (WindowPtr) -1);
  190.     assert(gTestLoLevelDialog != NULL);
  191.     
  192.     SetPort(gTestLoLevelDialog);
  193.     TextFont(geneva);
  194.     TextSize(10);
  195.     
  196.     // Fix up the line height
  197.     GetFontInfo(&fontInfo);
  198.     
  199.     textEdit = ((DialogPeek) gTestLoLevelDialog)->textH;
  200.     
  201.     (*textEdit)->lineHeight = fontInfo.ascent+fontInfo.descent+fontInfo.leading;
  202.     (*textEdit)->fontAscent = fontInfo.ascent;
  203.     
  204.     // Set up our method table
  205.     Window_New(gTestLoLevelDialog, TestLoLevel_MetaHandler);
  206.     
  207.     // Do the user items
  208.     GetDialogItem(gTestLoLevelDialog, kLoLevelItem_UpdateHilite, &itemType, &itemHandle, &itemBounds);
  209.     SetDialogItem(gTestLoLevelDialog, kLoLevelItem_UpdateHilite, itemType, (Handle) Utils_GetOKUserItemProc(), &itemBounds);
  210.     
  211.     gTestLoLevelProgressUserItem = NewUserItemProc(TestLoLevel_ProgressUserItem);
  212.     assert(gTestLoLevelProgressUserItem != NULL);
  213.     
  214.     GetDialogItem(gTestLoLevelDialog, kLoLevelItem_Progress, &itemType, &itemHandle, &itemBounds);
  215.     SetDialogItem(gTestLoLevelDialog, kLoLevelItem_Progress, itemType, (Handle) gTestLoLevelProgressUserItem, &itemBounds);
  216.     
  217.     // Show the quality limit
  218.     sprintf((char*) str, "x[0..%ld]", gTestLoLevelCPULoadLimit);
  219.     str[0] = strlen((char*) str)-1;
  220.     
  221.     GetDialogItem(gTestLoLevelDialog, kLoLevelItem_CPULoadUnits, &itemType, &itemHandle, &itemBounds);
  222.     SetDialogItemText(itemHandle, str);
  223.     
  224.     // Set the initial field values
  225.     TestLoLevel_Preset(1);
  226.     
  227.     // Select the first field
  228.     SelectDialogItemText(gTestLoLevelDialog, kLoLevelItem_Duration, 0, 32767);
  229.     
  230.     // Show the dialog
  231.     ShowWindow(gTestLoLevelDialog);
  232.     
  233.     // Initialize our cycle timer
  234.     Microseconds(&gTestLoLevelCycleStart);
  235. }
  236.  
  237.  
  238. /* =============================================================================
  239.  *        TestLoLevel_Exit (external)
  240.  *
  241.  *    Cleans up.
  242.  * ========================================================================== */
  243. void TestLoLevel_Exit(
  244.     void)
  245. {
  246.     //• TODO: Save gTestLoLevel to preferences
  247.     
  248.     if (gTestLoLevelDialog != NULL)
  249.     {
  250.         DisposeDialog(gTestLoLevelDialog);
  251.         gTestLoLevelDialog = NULL;
  252.     }
  253.     
  254.     if (gTestLoLevelProgressUserItem != NULL)
  255.     {
  256.         DisposeRoutineDescriptor(gTestLoLevelProgressUserItem);
  257.         gTestLoLevelProgressUserItem = NULL;
  258.     }
  259. }
  260.  
  261.  
  262. /* =============================================================================
  263.  *        TestLoLevel_MetaHandler (internal)
  264.  *
  265.  *    Returns the method function pointer that corresponds to the given ID.
  266.  * ========================================================================== */
  267. WindowMethodPtr TestLoLevel_MetaHandler(
  268.     WindowMethod        inMethod)
  269. {
  270.     WindowMethodPtr        result;
  271.     
  272.     result = NULL;
  273.     
  274.     switch (inMethod)
  275.     {
  276.         case kWindowMethod_GetSleep:
  277.             result = (WindowMethodPtr) TestLoLevel_GetSleep;
  278.         break;
  279.         
  280.         case kWindowMethod_ConsumeEvent:
  281.             result = (WindowMethodPtr) TestLoLevel_ConsumeEvent;
  282.         break;
  283.         
  284.         case kWindowMethod_Update:
  285.             result = (WindowMethodPtr) TestLoLevel_Update;
  286.         break;
  287.         
  288.         case kWindowMethod_Activate:
  289.             result = (WindowMethodPtr) TestLoLevel_Activate;
  290.         break;
  291.         
  292.         case kWindowMethod_Deactivate:
  293.             result = (WindowMethodPtr) TestLoLevel_Deactivate;
  294.         break;
  295.     }
  296.     
  297.     return result;
  298. }
  299.  
  300.  
  301. /* =============================================================================
  302.  *        TestLoLevel_GetSleep (internal)
  303.  *
  304.  *    Returns the sleep time to pass to WaitNextEvent when we're in front.
  305.  * ========================================================================== */
  306. void TestLoLevel_GetSleep(
  307.     WindowPtr            inWindow,
  308.     UInt32*                outSleep)
  309. {
  310.     assert(outSleep != NULL);
  311.     
  312.     *outSleep = 0;
  313. }
  314.  
  315.  
  316. /* =============================================================================
  317.  *        TestLoLevel_ConsumeEvent (internal)
  318.  *
  319.  *    Called for each event when this is the front window.
  320.  * ========================================================================== */
  321. void TestLoLevel_ConsumeEvent(
  322.     WindowPtr            inWindow,
  323.     const EventRecord*    inEvent,
  324.     Boolean*            outConsumed)
  325. {
  326.     short                itemType;
  327.     Handle                itemHandle;
  328.     Rect                itemBounds;
  329.     ControlHandle        updateButton;
  330.     Boolean                consumed;
  331.     Boolean                passToDialog;
  332.     WindowPtr            window;
  333.     short                item;
  334.     unsigned long        timeout;
  335.     UnsignedWide        now;
  336.     
  337.     assert(inEvent != NULL);
  338.     assert(outConsumed != NULL);
  339.     
  340.     consumed = false;
  341.     passToDialog = true;
  342.     
  343.     // We want to handle some events ourself
  344.     switch (inEvent->what)
  345.     {
  346.         case keyDown:
  347.         case autoKey:
  348.             passToDialog = false;
  349.             
  350.             if (inEvent->modifiers & cmdKey)
  351.             {
  352.                 if (inEvent->what != autoKey)
  353.                 {
  354.                     switch (inEvent->message & charCodeMask)
  355.                     {
  356.                         case '.':
  357.                             // anything here?
  358.                         break;
  359.                     }
  360.                 }
  361.             }
  362.             else
  363.             {
  364.                 switch (inEvent->message & charCodeMask)
  365.                 {
  366.                     case 0x08:  // backspace
  367.                     case 0x09:  // tab
  368.                     case 0x1C:  // cursor left
  369.                     case 0x1D:  // cursor right
  370.                     case 0x1E:  // cursor up
  371.                     case 0x1F:  // cursor down
  372.                     case '.':
  373.                     case '-':
  374.                     case '0':
  375.                     case '1':
  376.                     case '2':
  377.                     case '3':
  378.                     case '4':
  379.                     case '5':
  380.                     case '6':
  381.                     case '7':
  382.                     case '8':
  383.                     case '9':
  384.                         // Pass it to the dialog
  385.                         passToDialog = true;
  386.                     break;
  387.                     
  388.                     case 0x03:  // enter
  389.                     case 0x0D:  // return
  390.                         if (inEvent->what != autoKey)
  391.                         {
  392.                             // Update button equivalent
  393.                             GetDialogItem(gTestLoLevelDialog, kLoLevelItem_Update, &itemType, &itemHandle, &itemBounds);
  394.                             updateButton = (ControlHandle) itemHandle;
  395.                             
  396.                             if ((*updateButton)->contrlHilite == 0)
  397.                             {
  398.                                 HiliteControl(updateButton, 1);
  399.                                 
  400.                                 timeout = TickCount()+6;
  401.                                 while (TickCount() < timeout) /* wait */;
  402.                                 
  403.                                 HiliteControl(updateButton, 0);
  404.                                 
  405.                                 TestLoLevel_GetDialogFields();
  406.                                 
  407.                                 consumed = true;
  408.                             }
  409.                         }
  410.                     break;
  411.                     
  412.                     default:
  413.                         SysBeep(10);
  414.                         consumed = true;
  415.                 }
  416.             }
  417.         break;
  418.         
  419.         case activateEvt:
  420.             // We need to look at the activate event here because it is
  421.             // consumed by IsDialogEvent/DialogSelect below and so never
  422.             // gets to the window stuff
  423.             window = (WindowPtr) inEvent->message;
  424.             
  425.             if (inEvent->modifiers & activeFlag)
  426.             {
  427.                 Window_Activate(window);
  428.             }
  429.             else
  430.             {
  431.                 Window_Deactivate(window);
  432.             }
  433.         break;
  434.         
  435.         case nullEvent:
  436.             // Find where we are in the cycle (0 is start, 1 is end)
  437.             Microseconds(&now);
  438.             gTestLoLevelInterpolant = Utils_Interval(&gTestLoLevelCycleStart, &now) / gTestLoLevelData.duration;
  439.             
  440.             switch (Menu_GetInterpolation())
  441.             {
  442.                 case kInterpolationItem_Sinusoidal:
  443.                     gTestLoLevelInterpolant = 0.5*sinf(gTestLoLevelInterpolant*_PI*2.0) + 0.5;
  444.                 break;
  445.                 
  446.                 case kInterpolationItem_Triangular:
  447.                     gTestLoLevelInterpolant = 2.0*fmodf(gTestLoLevelInterpolant, 1.0);
  448.                     
  449.                     if (gTestLoLevelInterpolant > 1.0)
  450.                     {
  451.                         gTestLoLevelInterpolant = 2.0-gTestLoLevelInterpolant;
  452.                     }
  453.                 break;
  454.                 
  455.                 case kInterpolationItem_Sawtooth:
  456.                     gTestLoLevelInterpolant = fmodf(2.0*gTestLoLevelInterpolant, 1.0);
  457.                 break;
  458.             }
  459.             
  460.             TestLoLevel_Interpolate();
  461.         break;
  462.     }
  463.     
  464.     // Do dialog stuff
  465.     if (passToDialog)
  466.     {
  467.         consumed = IsDialogEvent(inEvent);
  468.         if (consumed)
  469.         {
  470.             if (DialogSelect(inEvent, &window, &item))
  471.             {
  472.                 switch (item)
  473.                 {
  474.                     case kLoLevelItem_Update:
  475.                         TestLoLevel_GetDialogFields();
  476.                     break;
  477.                 }
  478.             }
  479.         }
  480.     }
  481.     
  482.     // Return the result
  483.     *outConsumed = consumed;
  484. }
  485.  
  486.  
  487. /* =============================================================================
  488.  *        TestLoLevel_Update (internal)
  489.  *
  490.  *    Updates the contents of the window.
  491.  * ========================================================================== */
  492. void TestLoLevel_Update(
  493.     WindowPtr            inWindow)
  494. {
  495.     DrawDialog(inWindow);
  496. }
  497.  
  498.  
  499. /* =============================================================================
  500.  *        TestLoLevel_Activate (internal)
  501.  *
  502.  *    Handles window activation.
  503.  * ========================================================================== */
  504. void TestLoLevel_Activate(
  505.     WindowPtr            inWindow)
  506. {
  507.     InsertMenu(gTestLoLevelPresetMenu, 0);
  508.     DrawMenuBar();
  509. }
  510.  
  511.  
  512. /* =============================================================================
  513.  *        TestLoLevel_Deactivate (internal)
  514.  *
  515.  *    Handles window deactivation.
  516.  * ========================================================================== */
  517. void TestLoLevel_Deactivate(
  518.     WindowPtr            inWindow)
  519. {
  520.     DeleteMenu(kMenuID_LoLevelPreset);
  521.     DrawMenuBar();
  522. }
  523.  
  524.  
  525. /* =============================================================================
  526.  *        TestLoLevel_ProgressUserItem (internal)
  527.  *
  528.  *    Draws the user item used for progress bar, based on gTestLoLevelInterpolant.
  529.  * ========================================================================== */
  530. pascal void TestLoLevel_ProgressUserItem(
  531.     DialogPtr            inDialog,
  532.     short                inItem)
  533. {
  534.     short                itemType;
  535.     Handle                itemHandle;
  536.     Rect                itemBounds;
  537.     short                size;
  538.     Rect                leftWhite;
  539.     Rect                rightWhite;
  540.     Rect                indicator;
  541.     
  542.     GetDialogItem(inDialog, inItem, &itemType, &itemHandle, &itemBounds);
  543.     
  544.     FrameRect(&itemBounds);
  545.     
  546.     InsetRect(&itemBounds, 1, 1);
  547.     size = itemBounds.bottom-itemBounds.top;
  548.     
  549.     indicator = itemBounds;
  550.     indicator.left = itemBounds.left + (long) (gTestLoLevelInterpolant*(itemBounds.right-itemBounds.left-size) + 0.5);
  551.     indicator.right = indicator.left+size;
  552.     
  553.     leftWhite = itemBounds;
  554.     leftWhite.right = indicator.left;
  555.     
  556.     rightWhite = itemBounds;
  557.     rightWhite.left = indicator.right;
  558.     
  559.     FrameRect(&indicator);
  560.     
  561.     InsetRect(&indicator, 1, 1);
  562.     FillRect(&indicator, &qd.gray);
  563.     
  564.     EraseRect(&leftWhite);
  565.     EraseRect(&rightWhite);
  566. }
  567.  
  568.  
  569. /* =============================================================================
  570.  *        TestLoLevel_Interpolate (internal)
  571.  *
  572.  *    Changes the sound channel to the correct values for the point between
  573.  *    zero and one determined by gTestLoLevelInterpolant.
  574.  * ========================================================================== */
  575. void TestLoLevel_Interpolate(
  576.     void)
  577. {
  578.     SSpLocalizationData            snd3DInfo;
  579.     float                        elevation;
  580.     float                        azimuth;
  581.     
  582.     snd3DInfo.cpuLoad = (UInt32) (TestLoLevel_DoInterpolate(
  583.             gTestLoLevelInterpolant,
  584.             (float) gTestLoLevelData.cpuLoad1,
  585.             (float) gTestLoLevelData.cpuLoad2,
  586.             gTestLoLevelData.cpuLoadRange) + 0.5);
  587.     
  588.     snd3DInfo.medium = gTestLoLevelData.medium;
  589.     
  590.     snd3DInfo.humidity = TestLoLevel_DoInterpolate(
  591.             gTestLoLevelInterpolant,
  592.             gTestLoLevelData.humidity1,
  593.             gTestLoLevelData.humidity2,
  594.             gTestLoLevelData.humidityRange);
  595.     
  596.     snd3DInfo.roomSize = TestLoLevel_DoInterpolate(
  597.             gTestLoLevelInterpolant,
  598.             gTestLoLevelData.roomSize1,
  599.             gTestLoLevelData.roomSize2,
  600.             gTestLoLevelData.roomSizeRange);
  601.     
  602.     snd3DInfo.roomReflectivity = TestLoLevel_DoInterpolate(
  603.             gTestLoLevelInterpolant,
  604.             gTestLoLevelData.roomReflectivity1,
  605.             gTestLoLevelData.roomReflectivity2,
  606.             gTestLoLevelData.roomReflectivityRange);
  607.     
  608.     snd3DInfo.reverbAttenuation = TestLoLevel_DoInterpolate(
  609.             gTestLoLevelInterpolant,
  610.             gTestLoLevelData.reverbAttenuation1,
  611.             gTestLoLevelData.reverbAttenuation2,
  612.             gTestLoLevelData.reverbAttenuationRange);
  613.     
  614.     snd3DInfo.sourceMode = gTestLoLevelData.sourceMode;
  615.     
  616.     snd3DInfo.referenceDistance = TestLoLevel_DoInterpolate(
  617.             gTestLoLevelInterpolant,
  618.             gTestLoLevelData.referenceDistance1,
  619.             gTestLoLevelData.referenceDistance2,
  620.             gTestLoLevelData.referenceDistanceRange);
  621.     
  622.     snd3DInfo.coneAngleCos = TestLoLevel_DoInterpolate(
  623.             gTestLoLevelInterpolant,
  624.             gTestLoLevelData.coneAngleCos1,
  625.             gTestLoLevelData.coneAngleCos2,
  626.             gTestLoLevelData.coneAngleDegRange);
  627.     
  628.     snd3DInfo.coneAttenuation = TestLoLevel_DoInterpolate(
  629.             gTestLoLevelInterpolant,
  630.             gTestLoLevelData.coneAttenuation1,
  631.             gTestLoLevelData.coneAttenuation2,
  632.             gTestLoLevelData.coneAttenuationRange);
  633.     
  634.     // Wrap the azimuth and elevation to fit in their ranges
  635.     elevation = TestLoLevel_DoInterpolate(
  636.             gTestLoLevelInterpolant,
  637.             gTestLoLevelData.elevation1,
  638.             gTestLoLevelData.elevation2,
  639.             gTestLoLevelData.elevationDegRange);
  640.     
  641.     azimuth = TestLoLevel_DoInterpolate(
  642.             gTestLoLevelInterpolant,
  643.             gTestLoLevelData.azimuth1,
  644.             gTestLoLevelData.azimuth2,
  645.             gTestLoLevelData.azimuthDegRange);
  646.     
  647.     // find azimuth in the range -2π..2π
  648.     azimuth = fmodf(azimuth, 2.0*_PI);
  649.     
  650.     // find azimuth in the range -π..π
  651.     if (azimuth < -_PI)
  652.     {
  653.         azimuth += 2.0*_PI;
  654.     }
  655.     else if (azimuth > _PI)
  656.     {
  657.         azimuth -= 2.0*_PI;
  658.     }
  659.     
  660.     // find azimuth in the range -π/2..π/2
  661.     if (azimuth < -0.5*_PI)
  662.     {
  663.         azimuth = -_PI-azimuth;
  664.         elevation -= _PI;
  665.     }
  666.     else if (azimuth > 0.5*_PI)
  667.     {
  668.         azimuth = _PI-azimuth;
  669.         elevation -= _PI;
  670.     }
  671.     
  672.     // find elevation in the range -2π..2π
  673.     elevation = fmodf(elevation, 2.0*_PI);
  674.     
  675.     // find elevation in the range -π..π
  676.     if (elevation < -_PI)
  677.     {
  678.         elevation += 2.0*_PI;
  679.     }
  680.     else if (elevation > _PI)
  681.     {
  682.         elevation -= 2.0*_PI;
  683.     }
  684.     
  685.     snd3DInfo.currentLocation.elevation = elevation;
  686.     snd3DInfo.currentLocation.azimuth = azimuth;
  687.     
  688.     snd3DInfo.currentLocation.distance = TestLoLevel_DoInterpolate(
  689.             gTestLoLevelInterpolant,
  690.             gTestLoLevelData.distance1,
  691.             gTestLoLevelData.distance2,
  692.             gTestLoLevelData.distanceRange);
  693.     
  694.     snd3DInfo.currentLocation.projectionAngle = TestLoLevel_DoInterpolate(
  695.             gTestLoLevelInterpolant,
  696.             gTestLoLevelData.projectionAngle1,
  697.             gTestLoLevelData.projectionAngle2,
  698.             gTestLoLevelData.projectionAngleDegRange);
  699.     
  700.     snd3DInfo.currentLocation.sourceVelocity = TestLoLevel_DoInterpolate(
  701.             gTestLoLevelInterpolant,
  702.             gTestLoLevelData.sourceVelocity1,
  703.             gTestLoLevelData.sourceVelocity2,
  704.             gTestLoLevelData.sourceVelocityRange);
  705.     
  706.     snd3DInfo.currentLocation.listenerVelocity = TestLoLevel_DoInterpolate(
  707.             gTestLoLevelInterpolant,
  708.             gTestLoLevelData.listenerVelocity1,
  709.             gTestLoLevelData.listenerVelocity2,
  710.             gTestLoLevelData.listenerVelocityRange);
  711.     
  712.     snd3DInfo.reserved0 = 0;
  713.     snd3DInfo.reserved1 = 0;
  714.     snd3DInfo.reserved2 = 0;
  715.     snd3DInfo.reserved3 = 0;
  716.     
  717.     snd3DInfo.virtualSourceCount = 0;
  718.     
  719.     // Make the filter changes
  720.     Sound_Set3DInfo(&snd3DInfo);
  721.     
  722.     // Update the progress bar
  723.     SetPort(gTestLoLevelDialog);
  724.     TestLoLevel_ProgressUserItem(gTestLoLevelDialog, kLoLevelItem_Progress);
  725. }
  726.  
  727.  
  728. /* =============================================================================
  729.  *        TestLoLevel_DoInterpolate (internal)
  730.  *
  731.  *    Linear interpolation.  When inWhere is zero, inVal0 is returned.  When it
  732.  *    is one, inVal1 is returned.  In between is linear.  If inIsRange is false
  733.  *    then we ignore inVal1 and always return inVal0.
  734.  * ========================================================================== */
  735. float TestLoLevel_DoInterpolate(
  736.     float                inWhere,
  737.     float                inVal0,
  738.     float                inVal1,
  739.     Boolean                inIsRange)
  740. {
  741.     float                result;
  742.     
  743.     if (inIsRange)
  744.     {
  745.         result = inWhere*(inVal1-inVal0) + inVal0;
  746.     }
  747.     else
  748.     {
  749.         result = inVal0;
  750.     }
  751.     
  752.     return result;
  753. }
  754.  
  755.  
  756. /* =============================================================================
  757.  *        TestLoLevel_DeriveData (internal)
  758.  *
  759.  *    Compute the derived fields in gTestLoLevelData.
  760.  * ========================================================================== */
  761. void TestLoLevel_DeriveData(
  762.     void)
  763. {
  764.     gTestLoLevelData.coneAngleCos1            = cosf(0.5*(_PI/180.0)*gTestLoLevelData.coneAngleDeg1);
  765.     gTestLoLevelData.coneAngleCos2            = cosf(0.5*(_PI/180.0)*gTestLoLevelData.coneAngleDeg2);
  766.     
  767.     gTestLoLevelData.elevation1                = (_PI/180.0)*gTestLoLevelData.elevationDeg1;
  768.     gTestLoLevelData.elevation2                = (_PI/180.0)*gTestLoLevelData.elevationDeg2;
  769.     
  770.     gTestLoLevelData.azimuth1                = (_PI/180.0)*gTestLoLevelData.azimuthDeg1;
  771.     gTestLoLevelData.azimuth2                = (_PI/180.0)*gTestLoLevelData.azimuthDeg2;
  772.     
  773.     gTestLoLevelData.projectionAngle1        = cosf((_PI/180.0)*gTestLoLevelData.projectionAngleDeg1);
  774.     gTestLoLevelData.projectionAngle2        = cosf((_PI/180.0)*gTestLoLevelData.projectionAngleDeg2);
  775. }
  776.  
  777.  
  778. /* =============================================================================
  779.  *        TestLoLevel_SetDialogFields (internal)
  780.  *
  781.  *    Changes the dialog's fields to reflect gTestLoLevelData.
  782.  * ========================================================================== */
  783. void TestLoLevel_SetDialogFields(
  784.     void)
  785. {
  786.     short                itemType;
  787.     Handle                itemHandle;
  788.     Rect                itemBounds;
  789.     short                value;
  790.     
  791.     Utils_SetFloatField(
  792.             gTestLoLevelDialog,
  793.             kLoLevelItem_Duration,
  794.             gTestLoLevelData.duration,
  795.             true);
  796.     
  797.     Utils_SetUInt32Field(
  798.             gTestLoLevelDialog,
  799.             kLoLevelItem_CPULoad1,
  800.             gTestLoLevelData.cpuLoad1,
  801.             true);
  802.     
  803.     Utils_SetUInt32Field(
  804.             gTestLoLevelDialog,
  805.             kLoLevelItem_CPULoad2,
  806.             gTestLoLevelData.cpuLoad2,
  807.             gTestLoLevelData.cpuLoadRange);
  808.     
  809.     GetDialogItem(gTestLoLevelDialog, kLoLevelItem_Medium, &itemType, &itemHandle, &itemBounds);
  810.     SetControlValue((ControlHandle) itemHandle,
  811.             (gTestLoLevelData.medium == kSSpMedium_Water)
  812.                     ? kMediumItem_Water
  813.                     : kMediumItem_Air);
  814.     
  815.     Utils_SetFloatField(
  816.             gTestLoLevelDialog,
  817.             kLoLevelItem_Humidity1,
  818.             gTestLoLevelData.humidity1,
  819.             true);
  820.     
  821.     Utils_SetFloatField(
  822.             gTestLoLevelDialog,
  823.             kLoLevelItem_Humidity2,
  824.             gTestLoLevelData.humidity2,
  825.             gTestLoLevelData.humidityRange);
  826.     
  827.     Utils_SetFloatField(
  828.             gTestLoLevelDialog,
  829.             kLoLevelItem_RoomSize1,
  830.             gTestLoLevelData.roomSize1,
  831.             true);
  832.     
  833.     Utils_SetFloatField(
  834.             gTestLoLevelDialog,
  835.             kLoLevelItem_RoomSize2,
  836.             gTestLoLevelData.roomSize2,
  837.             gTestLoLevelData.roomSizeRange);
  838.     
  839.     Utils_SetFloatField(
  840.             gTestLoLevelDialog,
  841.             kLoLevelItem_RoomReflectivity1,
  842.             gTestLoLevelData.roomReflectivity1,
  843.             true);
  844.     
  845.     Utils_SetFloatField(
  846.             gTestLoLevelDialog,
  847.             kLoLevelItem_RoomReflectivity2,
  848.             gTestLoLevelData.roomReflectivity2,
  849.             gTestLoLevelData.roomReflectivityRange);
  850.     
  851.     Utils_SetFloatField(
  852.             gTestLoLevelDialog,
  853.             kLoLevelItem_ReverbAttenuation1,
  854.             gTestLoLevelData.reverbAttenuation1,
  855.             true);
  856.     
  857.     Utils_SetFloatField(
  858.             gTestLoLevelDialog,
  859.             kLoLevelItem_ReverbAttenuation2,
  860.             gTestLoLevelData.reverbAttenuation2,
  861.             gTestLoLevelData.reverbAttenuationRange);
  862.     
  863.     value = kSourceModeItem_Unfiltered;
  864.     switch (gTestLoLevelData.sourceMode)
  865.     {
  866.         case kSSpSourceMode_Localized:
  867.             value = kSourceModeItem_Localized;
  868.         break;
  869.         
  870.         case kSSpSourceMode_Ambient:
  871.             value = kSourceModeItem_Ambient;
  872.         break;
  873.         
  874.         case kSSpSourceMode_Binaural:
  875.             value = kSourceModeItem_Binaural;
  876.         break;
  877.     }
  878.     
  879.     GetDialogItem(gTestLoLevelDialog, kLoLevelItem_SourceMode, &itemType, &itemHandle, &itemBounds);
  880.     SetControlValue((ControlHandle) itemHandle, value);
  881.     
  882.     Utils_SetFloatField(
  883.             gTestLoLevelDialog,
  884.             kLoLevelItem_ReferenceDistance1,
  885.             gTestLoLevelData.referenceDistance1,
  886.             true);
  887.     
  888.     Utils_SetFloatField(
  889.             gTestLoLevelDialog,
  890.             kLoLevelItem_ReferenceDistance2,
  891.             gTestLoLevelData.referenceDistance2,
  892.             gTestLoLevelData.referenceDistanceRange);
  893.     
  894.     Utils_SetFloatField(
  895.             gTestLoLevelDialog,
  896.             kLoLevelItem_ConeAngleDeg1,
  897.             gTestLoLevelData.coneAngleDeg1,
  898.             true);
  899.     
  900.     Utils_SetFloatField(
  901.             gTestLoLevelDialog,
  902.             kLoLevelItem_ConeAngleDeg2,
  903.             gTestLoLevelData.coneAngleDeg2,
  904.             gTestLoLevelData.coneAngleDegRange);
  905.     
  906.     Utils_SetFloatField(
  907.             gTestLoLevelDialog,
  908.             kLoLevelItem_ConeAttenuation1,
  909.             gTestLoLevelData.coneAttenuation1,
  910.             true);
  911.     
  912.     Utils_SetFloatField(
  913.             gTestLoLevelDialog,
  914.             kLoLevelItem_ConeAttenuation2,
  915.             gTestLoLevelData.coneAttenuation2,
  916.             gTestLoLevelData.coneAttenuationRange);
  917.     
  918.     Utils_SetFloatField(
  919.             gTestLoLevelDialog,
  920.             kLoLevelItem_ElevationDeg1,
  921.             gTestLoLevelData.elevationDeg1,
  922.             true);
  923.     
  924.     Utils_SetFloatField(
  925.             gTestLoLevelDialog,
  926.             kLoLevelItem_ElevationDeg2,
  927.             gTestLoLevelData.elevationDeg2,
  928.             gTestLoLevelData.elevationDegRange);
  929.     
  930.     Utils_SetFloatField(
  931.             gTestLoLevelDialog,
  932.             kLoLevelItem_AzimuthDeg1,
  933.             gTestLoLevelData.azimuthDeg1,
  934.             true);
  935.     
  936.     Utils_SetFloatField(
  937.             gTestLoLevelDialog,
  938.             kLoLevelItem_AzimuthDeg2,
  939.             gTestLoLevelData.azimuthDeg2,
  940.             gTestLoLevelData.azimuthDegRange);
  941.     
  942.     Utils_SetFloatField(
  943.             gTestLoLevelDialog,
  944.             kLoLevelItem_Distance1,
  945.             gTestLoLevelData.distance1,
  946.             true);
  947.     
  948.     Utils_SetFloatField(
  949.             gTestLoLevelDialog,
  950.             kLoLevelItem_Distance2,
  951.             gTestLoLevelData.distance2,
  952.             gTestLoLevelData.distanceRange);
  953.     
  954.     Utils_SetFloatField(
  955.             gTestLoLevelDialog,
  956.             kLoLevelItem_ProjectionAngleDeg1,
  957.             gTestLoLevelData.projectionAngleDeg1,
  958.             true);
  959.     
  960.     Utils_SetFloatField(
  961.             gTestLoLevelDialog,
  962.             kLoLevelItem_ProjectionAngleDeg2,
  963.             gTestLoLevelData.projectionAngleDeg2,
  964.             gTestLoLevelData.projectionAngleDegRange);
  965.     
  966.     Utils_SetFloatField(
  967.             gTestLoLevelDialog,
  968.             kLoLevelItem_SourceVelocity1,
  969.             gTestLoLevelData.sourceVelocity1,
  970.             true);
  971.     
  972.     Utils_SetFloatField(
  973.             gTestLoLevelDialog,
  974.             kLoLevelItem_SourceVelocity2,
  975.             gTestLoLevelData.sourceVelocity2,
  976.             gTestLoLevelData.sourceVelocityRange);
  977.     
  978.     Utils_SetFloatField(
  979.             gTestLoLevelDialog,
  980.             kLoLevelItem_ListenerVelocity1,
  981.             gTestLoLevelData.listenerVelocity1,
  982.             true);
  983.     
  984.     Utils_SetFloatField(
  985.             gTestLoLevelDialog,
  986.             kLoLevelItem_ListenerVelocity2,
  987.             gTestLoLevelData.listenerVelocity2,
  988.             gTestLoLevelData.listenerVelocityRange);
  989. }
  990.  
  991.  
  992. /* =============================================================================
  993.  *        TestLoLevel_GetDialogFields (internal)
  994.  *
  995.  *    Grabs the contents of the dialog fields and puts them into gTestLoLevelData.
  996.  * ========================================================================== */
  997. void TestLoLevel_GetDialogFields(
  998.     void)
  999. {
  1000.     const float            small = 0.000001;
  1001.     const float            big = 10000000.0;
  1002.     short                itemType;
  1003.     Handle                itemHandle;
  1004.     Rect                itemBounds;
  1005.     TTestLoLevelData    data;
  1006.     short                badItem;
  1007.     
  1008.     if (!Utils_GetFloatField(
  1009.             gTestLoLevelDialog,
  1010.             kLoLevelItem_Duration,
  1011.             &data.duration,
  1012.             NULL,
  1013.             small,
  1014.             big))
  1015.     {
  1016.         badItem = kLoLevelItem_Duration;
  1017.         goto bail;
  1018.     }
  1019.     
  1020.     if (!Utils_GetUInt32Field(
  1021.             gTestLoLevelDialog,
  1022.             kLoLevelItem_CPULoad1,
  1023.             &data.cpuLoad1,
  1024.             NULL,
  1025.             0,
  1026.             gTestLoLevelCPULoadLimit))
  1027.     {
  1028.         badItem = kLoLevelItem_CPULoad1;
  1029.         goto bail;
  1030.     }
  1031.     
  1032.     if (!Utils_GetUInt32Field(
  1033.             gTestLoLevelDialog,
  1034.             kLoLevelItem_CPULoad2,
  1035.             &data.cpuLoad2,
  1036.             &data.cpuLoadRange,
  1037.             0,
  1038.             gTestLoLevelCPULoadLimit))
  1039.     {
  1040.         badItem = kLoLevelItem_CPULoad2;
  1041.         goto bail;
  1042.     }
  1043.     
  1044.     GetDialogItem(gTestLoLevelDialog, kLoLevelItem_Medium, &itemType, &itemHandle, &itemBounds);
  1045.     switch (GetControlValue((ControlHandle) itemHandle))
  1046.     {
  1047.         case kMediumItem_Air:
  1048.             data.medium = kSSpMedium_Air;
  1049.         break;
  1050.         
  1051.         case kMediumItem_Water:
  1052.             data.medium = kSSpMedium_Water;
  1053.         break;
  1054.         
  1055.         default:
  1056.             assert(0);
  1057.     }
  1058.     
  1059.     if (!Utils_GetFloatField(
  1060.             gTestLoLevelDialog,
  1061.             kLoLevelItem_Humidity1,
  1062.             &data.humidity1,
  1063.             NULL,
  1064.             0.0,
  1065.             100.0))
  1066.     {
  1067.         badItem = kLoLevelItem_Humidity1;
  1068.         goto bail;
  1069.     }
  1070.     
  1071.     if (!Utils_GetFloatField(
  1072.             gTestLoLevelDialog,
  1073.             kLoLevelItem_Humidity2,
  1074.             &data.humidity2,
  1075.             &data.humidityRange,
  1076.             0.0,
  1077.             100.0))
  1078.     {
  1079.         badItem = kLoLevelItem_Humidity2;
  1080.         goto bail;
  1081.     }
  1082.     
  1083.     if (!Utils_GetFloatField(
  1084.             gTestLoLevelDialog,
  1085.             kLoLevelItem_RoomSize1,
  1086.             &data.roomSize1,
  1087.             NULL,
  1088.             0.0,
  1089.             big))
  1090.     {
  1091.         badItem = kLoLevelItem_RoomSize1;
  1092.         goto bail;
  1093.     }
  1094.     
  1095.     if (!Utils_GetFloatField(
  1096.             gTestLoLevelDialog,
  1097.             kLoLevelItem_RoomSize2,
  1098.             &data.roomSize2,
  1099.             &data.roomSizeRange,
  1100.             0.0,
  1101.             big))
  1102.     {
  1103.         badItem = kLoLevelItem_RoomSize2;
  1104.         goto bail;
  1105.     }
  1106.     
  1107.     if (!Utils_GetFloatField(
  1108.             gTestLoLevelDialog,
  1109.             kLoLevelItem_RoomReflectivity1,
  1110.             &data.roomReflectivity1,
  1111.             NULL,
  1112.             -big,
  1113.             -small))
  1114.     {
  1115.         badItem = kLoLevelItem_RoomReflectivity1;
  1116.         goto bail;
  1117.     }
  1118.     
  1119.     if (!Utils_GetFloatField(
  1120.             gTestLoLevelDialog,
  1121.             kLoLevelItem_RoomReflectivity2,
  1122.             &data.roomReflectivity2,
  1123.             &data.roomReflectivityRange,
  1124.             -big,
  1125.             -small))
  1126.     {
  1127.         badItem = kLoLevelItem_RoomReflectivity2;
  1128.         goto bail;
  1129.     }
  1130.     
  1131.     if (!Utils_GetFloatField(
  1132.             gTestLoLevelDialog,
  1133.             kLoLevelItem_ReverbAttenuation1,
  1134.             &data.reverbAttenuation1,
  1135.             NULL,
  1136.             -big,
  1137.             big))
  1138.     {
  1139.         badItem = kLoLevelItem_ReverbAttenuation1;
  1140.         goto bail;
  1141.     }
  1142.     
  1143.     if (!Utils_GetFloatField(
  1144.             gTestLoLevelDialog,
  1145.             kLoLevelItem_ReverbAttenuation2,
  1146.             &data.reverbAttenuation2,
  1147.             &data.reverbAttenuationRange,
  1148.             -big,
  1149.             big))
  1150.     {
  1151.         badItem = kLoLevelItem_ReverbAttenuation2;
  1152.         goto bail;
  1153.     }
  1154.     
  1155.     GetDialogItem(gTestLoLevelDialog, kLoLevelItem_SourceMode, &itemType, &itemHandle, &itemBounds);
  1156.     switch (GetControlValue((ControlHandle) itemHandle))
  1157.     {
  1158.         case kSourceModeItem_Unfiltered:
  1159.             data.sourceMode = kSSpSourceMode_Unfiltered;
  1160.         break;
  1161.         
  1162.         case kSourceModeItem_Localized:
  1163.             data.sourceMode = kSSpSourceMode_Localized;
  1164.         break;
  1165.         
  1166.         case kSourceModeItem_Ambient:
  1167.             data.sourceMode = kSSpSourceMode_Ambient;
  1168.         break;
  1169.         
  1170.         case kSourceModeItem_Binaural:
  1171.             data.sourceMode = kSSpSourceMode_Binaural;
  1172.         break;
  1173.         
  1174.         default:
  1175.             assert(0);
  1176.     }
  1177.     
  1178.     if (!Utils_GetFloatField(
  1179.             gTestLoLevelDialog,
  1180.             kLoLevelItem_ReferenceDistance1,
  1181.             &data.referenceDistance1,
  1182.             NULL,
  1183.             small,
  1184.             big))
  1185.     {
  1186.         badItem = kLoLevelItem_ReferenceDistance1;
  1187.         goto bail;
  1188.     }
  1189.     
  1190.     if (!Utils_GetFloatField(
  1191.             gTestLoLevelDialog,
  1192.             kLoLevelItem_ReferenceDistance2,
  1193.             &data.referenceDistance2,
  1194.             &data.referenceDistanceRange,
  1195.             small,
  1196.             big))
  1197.     {
  1198.         badItem = kLoLevelItem_ReferenceDistance2;
  1199.         goto bail;
  1200.     }
  1201.     
  1202.     if (!Utils_GetFloatField(
  1203.             gTestLoLevelDialog,
  1204.             kLoLevelItem_ConeAngleDeg1,
  1205.             &data.coneAngleDeg1,
  1206.             NULL,
  1207.             0.0,
  1208.             360.0))
  1209.     {
  1210.         badItem = kLoLevelItem_ConeAngleDeg1;
  1211.         goto bail;
  1212.     }
  1213.     
  1214.     if (!Utils_GetFloatField(
  1215.             gTestLoLevelDialog,
  1216.             kLoLevelItem_ConeAngleDeg2,
  1217.             &data.coneAngleDeg2,
  1218.             &data.coneAngleDegRange,
  1219.             0.0,
  1220.             360.0))
  1221.     {
  1222.         badItem = kLoLevelItem_ConeAngleDeg2;
  1223.         goto bail;
  1224.     }
  1225.     
  1226.     if (!Utils_GetFloatField(
  1227.             gTestLoLevelDialog,
  1228.             kLoLevelItem_ConeAttenuation1,
  1229.             &data.coneAttenuation1,
  1230.             NULL,
  1231.             -big,
  1232.             big))
  1233.     {
  1234.         badItem = kLoLevelItem_ConeAttenuation1;
  1235.         goto bail;
  1236.     }
  1237.     
  1238.     if (!Utils_GetFloatField(
  1239.             gTestLoLevelDialog,
  1240.             kLoLevelItem_ConeAttenuation2,
  1241.             &data.coneAttenuation2,
  1242.             &data.coneAttenuationRange,
  1243.             -big,
  1244.             big))
  1245.     {
  1246.         badItem = kLoLevelItem_ConeAttenuation2;
  1247.         goto bail;
  1248.     }
  1249.     
  1250.     if (!Utils_GetFloatField(
  1251.             gTestLoLevelDialog,
  1252.             kLoLevelItem_ElevationDeg1,
  1253.             &data.elevationDeg1,
  1254.             NULL,
  1255.             -big,
  1256.             big))
  1257.     {
  1258.         badItem = kLoLevelItem_ElevationDeg1;
  1259.         goto bail;
  1260.     }
  1261.     
  1262.     if (!Utils_GetFloatField(
  1263.             gTestLoLevelDialog,
  1264.             kLoLevelItem_ElevationDeg2,
  1265.             &data.elevationDeg2,
  1266.             &data.elevationDegRange,
  1267.             -big,
  1268.             big))
  1269.     {
  1270.         badItem = kLoLevelItem_ElevationDeg2;
  1271.         goto bail;
  1272.     }
  1273.     
  1274.     
  1275.     if (!Utils_GetFloatField(
  1276.             gTestLoLevelDialog,
  1277.             kLoLevelItem_AzimuthDeg1,
  1278.             &data.azimuthDeg1,
  1279.             NULL,
  1280.             -big,
  1281.             big))
  1282.     {
  1283.         badItem = kLoLevelItem_AzimuthDeg1;
  1284.         goto bail;
  1285.     }
  1286.     
  1287.     if (!Utils_GetFloatField(
  1288.             gTestLoLevelDialog,
  1289.             kLoLevelItem_AzimuthDeg2,
  1290.             &data.azimuthDeg2,
  1291.             &data.azimuthDegRange,
  1292.             -big,
  1293.             big))
  1294.     {
  1295.         badItem = kLoLevelItem_AzimuthDeg2;
  1296.         goto bail;
  1297.     }
  1298.     
  1299.     if (!Utils_GetFloatField(
  1300.             gTestLoLevelDialog,
  1301.             kLoLevelItem_Distance1,
  1302.             &data.distance1,
  1303.             NULL,
  1304.             small,
  1305.             big))
  1306.     {
  1307.         badItem = kLoLevelItem_Distance1;
  1308.         goto bail;
  1309.     }
  1310.     
  1311.     if (!Utils_GetFloatField(
  1312.             gTestLoLevelDialog,
  1313.             kLoLevelItem_Distance2,
  1314.             &data.distance2,
  1315.             &data.distanceRange,
  1316.             small,
  1317.             big))
  1318.     {
  1319.         badItem = kLoLevelItem_Distance2;
  1320.         goto bail;
  1321.     }
  1322.     
  1323.     if (!Utils_GetFloatField(
  1324.             gTestLoLevelDialog,
  1325.             kLoLevelItem_ProjectionAngleDeg1,
  1326.             &data.projectionAngleDeg1,
  1327.             NULL,
  1328.             0.0,
  1329.             180.0))
  1330.     {
  1331.         badItem = kLoLevelItem_ProjectionAngleDeg1;
  1332.         goto bail;
  1333.     }
  1334.     
  1335.     if (!Utils_GetFloatField(
  1336.             gTestLoLevelDialog,
  1337.             kLoLevelItem_ProjectionAngleDeg2,
  1338.             &data.projectionAngleDeg2,
  1339.             &data.projectionAngleDegRange,
  1340.             0.0,
  1341.             180.0))
  1342.     {
  1343.         badItem = kLoLevelItem_ProjectionAngleDeg2;
  1344.         goto bail;
  1345.     }
  1346.     
  1347.     if (!Utils_GetFloatField(
  1348.             gTestLoLevelDialog,
  1349.             kLoLevelItem_SourceVelocity1,
  1350.             &data.sourceVelocity1,
  1351.             NULL,
  1352.             -big,
  1353.             big))
  1354.     {
  1355.         badItem = kLoLevelItem_SourceVelocity1;
  1356.         goto bail;
  1357.     }
  1358.     
  1359.     if (!Utils_GetFloatField(
  1360.             gTestLoLevelDialog,
  1361.             kLoLevelItem_SourceVelocity2,
  1362.             &data.sourceVelocity2,
  1363.             &data.sourceVelocityRange,
  1364.             -big,
  1365.             big))
  1366.     {
  1367.         badItem = kLoLevelItem_SourceVelocity2;
  1368.         goto bail;
  1369.     }
  1370.     
  1371.     if (!Utils_GetFloatField(
  1372.             gTestLoLevelDialog,
  1373.             kLoLevelItem_ListenerVelocity1,
  1374.             &data.listenerVelocity1,
  1375.             NULL,
  1376.             -big,
  1377.             big))
  1378.     {
  1379.         badItem = kLoLevelItem_ListenerVelocity1;
  1380.         goto bail;
  1381.     }
  1382.     
  1383.     if (!Utils_GetFloatField(
  1384.             gTestLoLevelDialog,
  1385.             kLoLevelItem_ListenerVelocity2,
  1386.             &data.listenerVelocity2,
  1387.             &data.listenerVelocityRange,
  1388.             -big,
  1389.             big))
  1390.     {
  1391.         badItem = kLoLevelItem_ListenerVelocity2;
  1392.         goto bail;
  1393.     }
  1394.     
  1395.     // All fields are good -- finish up
  1396.     gTestLoLevelData = data;
  1397.     TestLoLevel_DeriveData();
  1398.     
  1399.     TestLoLevel_SetDialogFields();
  1400.     
  1401.     return;
  1402.     
  1403.     // Error exit
  1404. bail:
  1405.     SelectDialogItemText(gTestLoLevelDialog, badItem, 0, 32767);
  1406.     StopAlert(kAlrtID_BadField, NULL);
  1407. }
  1408.  
  1409.  
  1410. /* =============================================================================
  1411.  *        TestLoLevel_Preset (external)
  1412.  *
  1413.  *    Updates the fields to the chosen preset value.
  1414.  * ========================================================================== */
  1415. void TestLoLevel_Preset(
  1416.     UInt32            index)
  1417. {
  1418.     TTestLoLevelData preset[] = {
  1419.         { /* nothing for index zero */ },
  1420.         { /* Side-to-Side */
  1421.                 /* duration                */   4.0,
  1422.                 /* cpuLoad                */     0,     0, false,
  1423.                 /* medium                */ kSSpMedium_Air,
  1424.                 /* humidity                */   0.0,   0.0, false,
  1425.                 /* roomSize                */   0.0,   0.0, false,
  1426.                 /* roomReflectivity        */ -10.0,   0.0, false,
  1427.                 /* reverbAttenuation    */ -15.0,   0.0, false,
  1428.                 /* sourceMode            */ kSSpSourceMode_Localized,
  1429.                 /* referenceDistance    */   1.0,   0.0, false,
  1430.                 /* coneAngleDeg            */  90.0,   0.0, false,
  1431.                 /* coneAttenuation        */   0.0,   0.0, false,
  1432.                 /* elevationDeg            */   0.0,   0.0, false,
  1433.                 /* azimuthDeg            */ -90.0,  90.0, true,
  1434.                 /* distance                */   1.0,   0.0, false,
  1435.                 /* projectionAngleDeg    */   0.0,   0.0, false,
  1436.                 /* sourceVelocity        */   0.0,   0.0, false,
  1437.                 /* listenerVelocity        */   0.0,   0.0, false
  1438.         },
  1439.         { /* dividing line */ },
  1440.         { /* Ahead */
  1441.                 /* duration                */   4.0,
  1442.                 /* cpuLoad                */     0,     0, false,
  1443.                 /* medium                */ kSSpMedium_Air,
  1444.                 /* humidity                */   0.0,   0.0, false,
  1445.                 /* roomSize                */   0.0,   0.0, false,
  1446.                 /* roomReflectivity        */ -10.0,   0.0, false,
  1447.                 /* reverbAttenuation    */ -15.0,   0.0, false,
  1448.                 /* sourceMode            */ kSSpSourceMode_Localized,
  1449.                 /* referenceDistance    */   1.0,   0.0, false,
  1450.                 /* coneAngleDeg            */  90.0,   0.0, false,
  1451.                 /* coneAttenuation        */   0.0,   0.0, false,
  1452.                 /* elevationDeg            */   0.0,   0.0, false,
  1453.                 /* azimuthDeg            */   0.0,   0.0, false,
  1454.                 /* distance                */   1.0,  10.0, true,
  1455.                 /* projectionAngleDeg    */   0.0,   0.0, false,
  1456.                 /* sourceVelocity        */   0.0,   0.0, false,
  1457.                 /* listenerVelocity        */   0.0,   0.0, false
  1458.         },
  1459.         { /* Ahead-Right */
  1460.                 /* duration                */   4.0,
  1461.                 /* cpuLoad                */     0,     0, false,
  1462.                 /* medium                */ kSSpMedium_Air,
  1463.                 /* humidity                */   0.0,   0.0, false,
  1464.                 /* roomSize                */   0.0,   0.0, false,
  1465.                 /* roomReflectivity        */ -10.0,   0.0, false,
  1466.                 /* reverbAttenuation    */ -15.0,   0.0, false,
  1467.                 /* sourceMode            */ kSSpSourceMode_Localized,
  1468.                 /* referenceDistance    */   1.0,   0.0, false,
  1469.                 /* coneAngleDeg            */  90.0,   0.0, false,
  1470.                 /* coneAttenuation        */   0.0,   0.0, false,
  1471.                 /* elevationDeg            */   0.0,   0.0, false,
  1472.                 /* azimuthDeg            */  45.0,   0.0, false,
  1473.                 /* distance                */   1.0,  10.0, true,
  1474.                 /* projectionAngleDeg    */   0.0,   0.0, false,
  1475.                 /* sourceVelocity        */   0.0,   0.0, false,
  1476.                 /* listenerVelocity        */   0.0,   0.0, false
  1477.         },
  1478.         { /* Right */
  1479.                 /* duration                */   4.0,
  1480.                 /* cpuLoad                */     0,     0, false,
  1481.                 /* medium                */ kSSpMedium_Air,
  1482.                 /* humidity                */   0.0,   0.0, false,
  1483.                 /* roomSize                */   0.0,   0.0, false,
  1484.                 /* roomReflectivity        */ -10.0,   0.0, false,
  1485.                 /* reverbAttenuation    */ -15.0,   0.0, false,
  1486.                 /* sourceMode            */ kSSpSourceMode_Localized,
  1487.                 /* referenceDistance    */   1.0,   0.0, false,
  1488.                 /* coneAngleDeg            */  90.0,   0.0, false,
  1489.                 /* coneAttenuation        */   0.0,   0.0, false,
  1490.                 /* elevationDeg            */   0.0,   0.0, false,
  1491.                 /* azimuthDeg            */  90.0,   0.0, false,
  1492.                 /* distance                */   1.0,  10.0, true,
  1493.                 /* projectionAngleDeg    */   0.0,   0.0, false,
  1494.                 /* sourceVelocity        */   0.0,   0.0, false,
  1495.                 /* listenerVelocity        */   0.0,   0.0, false
  1496.         },
  1497.         { /* Behind-Right */
  1498.                 /* duration                */   4.0,
  1499.                 /* cpuLoad                */     0,     0, false,
  1500.                 /* medium                */ kSSpMedium_Air,
  1501.                 /* humidity                */   0.0,   0.0, false,
  1502.                 /* roomSize                */   0.0,   0.0, false,
  1503.                 /* roomReflectivity        */ -10.0,   0.0, false,
  1504.                 /* reverbAttenuation    */ -15.0,   0.0, false,
  1505.                 /* sourceMode            */ kSSpSourceMode_Localized,
  1506.                 /* referenceDistance    */   1.0,   0.0, false,
  1507.                 /* coneAngleDeg            */  90.0,   0.0, false,
  1508.                 /* coneAttenuation        */   0.0,   0.0, false,
  1509.                 /* elevationDeg            */ 180.0,   0.0, false,
  1510.                 /* azimuthDeg            */  45.0,   0.0, false,
  1511.                 /* distance                */   1.0,  10.0, true,
  1512.                 /* projectionAngleDeg    */   0.0,   0.0, false,
  1513.                 /* sourceVelocity        */   0.0,   0.0, false,
  1514.                 /* listenerVelocity        */   0.0,   0.0, false
  1515.         },
  1516.         { /* Behind */
  1517.                 /* duration                */   4.0,
  1518.                 /* cpuLoad                */     0,     0, false,
  1519.                 /* medium                */ kSSpMedium_Air,
  1520.                 /* humidity                */   0.0,   0.0, false,
  1521.                 /* roomSize                */   0.0,   0.0, false,
  1522.                 /* roomReflectivity        */ -10.0,   0.0, false,
  1523.                 /* reverbAttenuation    */ -15.0,   0.0, false,
  1524.                 /* sourceMode            */ kSSpSourceMode_Localized,
  1525.                 /* referenceDistance    */   1.0,   0.0, false,
  1526.                 /* coneAngleDeg            */  90.0,   0.0, false,
  1527.                 /* coneAttenuation        */   0.0,   0.0, false,
  1528.                 /* elevationDeg            */ 180.0,   0.0, false,
  1529.                 /* azimuthDeg            */   0.0,   0.0, false,
  1530.                 /* distance                */   1.0,  10.0, true,
  1531.                 /* projectionAngleDeg    */   0.0,   0.0, false,
  1532.                 /* sourceVelocity        */   0.0,   0.0, false,
  1533.                 /* listenerVelocity        */   0.0,   0.0, false
  1534.         },
  1535.         { /* Behind-Left */
  1536.                 /* duration                */   4.0,
  1537.                 /* cpuLoad                */     0,     0, false,
  1538.                 /* medium                */ kSSpMedium_Air,
  1539.                 /* humidity                */   0.0,   0.0, false,
  1540.                 /* roomSize                */   0.0,   0.0, false,
  1541.                 /* roomReflectivity        */ -10.0,   0.0, false,
  1542.                 /* reverbAttenuation    */ -15.0,   0.0, false,
  1543.                 /* sourceMode            */ kSSpSourceMode_Localized,
  1544.                 /* referenceDistance    */   1.0,   0.0, false,
  1545.                 /* coneAngleDeg            */  90.0,   0.0, false,
  1546.                 /* coneAttenuation        */   0.0,   0.0, false,
  1547.                 /* elevationDeg            */ 180.0,   0.0, false,
  1548.                 /* azimuthDeg            */ -45.0,   0.0, false,
  1549.                 /* distance                */   1.0,  10.0, true,
  1550.                 /* projectionAngleDeg    */   0.0,   0.0, false,
  1551.                 /* sourceVelocity        */   0.0,   0.0, false,
  1552.                 /* listenerVelocity        */   0.0,   0.0, false
  1553.         },
  1554.         { /* Left */
  1555.                 /* duration                */   4.0,
  1556.                 /* cpuLoad                */     0,     0, false,
  1557.                 /* medium                */ kSSpMedium_Air,
  1558.                 /* humidity                */   0.0,   0.0, false,
  1559.                 /* roomSize                */   0.0,   0.0, false,
  1560.                 /* roomReflectivity        */ -10.0,   0.0, false,
  1561.                 /* reverbAttenuation    */ -15.0,   0.0, false,
  1562.                 /* sourceMode            */ kSSpSourceMode_Localized,
  1563.                 /* referenceDistance    */   1.0,   0.0, false,
  1564.                 /* coneAngleDeg            */  90.0,   0.0, false,
  1565.                 /* coneAttenuation        */   0.0,   0.0, false,
  1566.                 /* elevationDeg            */   0.0,   0.0, false,
  1567.                 /* azimuthDeg            */ -90.0,   0.0, false,
  1568.                 /* distance                */   1.0,  10.0, true,
  1569.                 /* projectionAngleDeg    */   0.0,   0.0, false,
  1570.                 /* sourceVelocity        */   0.0,   0.0, false,
  1571.                 /* listenerVelocity        */   0.0,   0.0, false
  1572.         },
  1573.         { /* Ahead-Left */
  1574.                 /* duration                */   4.0,
  1575.                 /* cpuLoad                */     0,     0, false,
  1576.                 /* medium                */ kSSpMedium_Air,
  1577.                 /* humidity                */   0.0,   0.0, false,
  1578.                 /* roomSize                */   0.0,   0.0, false,
  1579.                 /* roomReflectivity        */ -10.0,   0.0, false,
  1580.                 /* reverbAttenuation    */ -15.0,   0.0, false,
  1581.                 /* sourceMode            */ kSSpSourceMode_Localized,
  1582.                 /* referenceDistance    */   1.0,   0.0, false,
  1583.                 /* coneAngleDeg            */  90.0,   0.0, false,
  1584.                 /* coneAttenuation        */   0.0,   0.0, false,
  1585.                 /* elevationDeg            */   0.0,   0.0, false,
  1586.                 /* azimuthDeg            */ -45.0,   0.0, false,
  1587.                 /* distance                */   1.0,  10.0, true,
  1588.                 /* projectionAngleDeg    */   0.0,   0.0, false,
  1589.                 /* sourceVelocity        */   0.0,   0.0, false,
  1590.                 /* listenerVelocity        */   0.0,   0.0, false
  1591.         },
  1592.         { /* dividing line */ },
  1593.         { /* Around (1 meter) */
  1594.                 /* duration                */    4.0,
  1595.                 /* cpuLoad                */      0,     0, false,
  1596.                 /* medium                */  kSSpMedium_Air,
  1597.                 /* humidity                */    0.0,   0.0, false,
  1598.                 /* roomSize                */    0.0,   0.0, false,
  1599.                 /* roomReflectivity        */  -10.0,   0.0, false,
  1600.                 /* reverbAttenuation    */  -15.0,   0.0, false,
  1601.                 /* sourceMode            */ kSSpSourceMode_Localized,
  1602.                 /* referenceDistance    */    1.0,   0.0, false,
  1603.                 /* coneAngleDeg            */   90.0,   0.0, false,
  1604.                 /* coneAttenuation        */    0.0,   0.0, false,
  1605.                 /* elevationDeg            */    0.0,   0.0, false,
  1606.                 /* azimuthDeg            */ -180.0, 180.0, true,
  1607.                 /* distance                */    1.0,   0.0, false,
  1608.                 /* projectionAngleDeg    */    0.0,   0.0, false,
  1609.                 /* sourceVelocity        */    0.0,   0.0, false,
  1610.                 /* listenerVelocity        */    0.0,   0.0, false
  1611.         },
  1612.         { /* Around (10 meters) */
  1613.                 /* duration                */    4.0,
  1614.                 /* cpuLoad                */      0,     0, false,
  1615.                 /* medium                */  kSSpMedium_Air,
  1616.                 /* humidity                */    0.0,   0.0, false,
  1617.                 /* roomSize                */    0.0,   0.0, false,
  1618.                 /* roomReflectivity        */  -10.0,   0.0, false,
  1619.                 /* reverbAttenuation    */  -15.0,   0.0, false,
  1620.                 /* sourceMode            */ kSSpSourceMode_Localized,
  1621.                 /* referenceDistance    */    1.0,   0.0, false,
  1622.                 /* coneAngleDeg            */   90.0,   0.0, false,
  1623.                 /* coneAttenuation        */    0.0,   0.0, false,
  1624.                 /* elevationDeg            */    0.0,   0.0, false,
  1625.                 /* azimuthDeg            */ -180.0, 180.0, true,
  1626.                 /* distance                */   10.0,   0.0, false,
  1627.                 /* projectionAngleDeg    */    0.0,   0.0, false,
  1628.                 /* sourceVelocity        */    0.0,   0.0, false,
  1629.                 /* listenerVelocity        */    0.0,   0.0, false
  1630.         },
  1631.         { /* dividing line */ },
  1632.         { /* Reverb — Living Room */
  1633.                 /* duration                */  10.0,
  1634.                 /* cpuLoad                */     0,     0, false,
  1635.                 /* medium                */ kSSpMedium_Air,
  1636.                 /* humidity                */   0.0,   0.0, false,
  1637.                 /* roomSize                */  10.0,   0.0, false,
  1638.                 /* roomReflectivity        */ -20.0,   0.0, false,
  1639.                 /* reverbAttenuation    */   0.0,   0.0, false,
  1640.                 /* sourceMode            */ kSSpSourceMode_Localized,
  1641.                 /* referenceDistance    */   1.0,   0.0, false,
  1642.                 /* coneAngleDeg            */  90.0,   0.0, false,
  1643.                 /* coneAttenuation        */   0.0,   0.0, false,
  1644.                 /* elevationDeg            */   0.0,   0.0, false,
  1645.                 /* azimuthDeg            */   0.0,   0.0, false,
  1646.                 /* distance                */   2.0,  10.0, true,
  1647.                 /* projectionAngleDeg    */   0.0,   0.0, false,
  1648.                 /* sourceVelocity        */   0.0,   0.0, false,
  1649.                 /* listenerVelocity        */   0.0,   0.0, false
  1650.         },
  1651.         { /* Reverb — Cave */
  1652.                 /* duration                */  10.0,
  1653.                 /* cpuLoad                */     0,     0, false,
  1654.                 /* medium                */ kSSpMedium_Air,
  1655.                 /* humidity                */   0.0,   0.0, false,
  1656.                 /* roomSize                */ 100.0,   0.0, false,
  1657.                 /* roomReflectivity        */ -40.0,   0.0, false,
  1658.                 /* reverbAttenuation    */  20.0,   0.0, false,
  1659.                 /* sourceMode            */ kSSpSourceMode_Localized,
  1660.                 /* referenceDistance    */   1.0,   0.0, false,
  1661.                 /* coneAngleDeg            */  90.0,   0.0, false,
  1662.                 /* coneAttenuation        */   0.0,   0.0, false,
  1663.                 /* elevationDeg            */   0.0,   0.0, false,
  1664.                 /* azimuthDeg            */   0.0,   0.0, false,
  1665.                 /* distance                */   2.0,  10.0, true,
  1666.                 /* projectionAngleDeg    */   0.0,   0.0, false,
  1667.                 /* sourceVelocity        */   0.0,   0.0, false,
  1668.                 /* listenerVelocity        */   0.0,   0.0, false
  1669.         },
  1670.         { /* Reverb — Stadium */
  1671.                 /* duration                */  10.0,
  1672.                 /* cpuLoad                */     0,     0, false,
  1673.                 /* medium                */ kSSpMedium_Air,
  1674.                 /* humidity                */   0.0,   0.0, false,
  1675.                 /* roomSize                */ 250.0,   0.0, false,
  1676.                 /* roomReflectivity        */ -15.0,   0.0, false,
  1677.                 /* reverbAttenuation    */  -5.0,   0.0, false,
  1678.                 /* sourceMode            */ kSSpSourceMode_Localized,
  1679.                 /* referenceDistance    */   1.0,   0.0, false,
  1680.                 /* coneAngleDeg            */  90.0,   0.0, false,
  1681.                 /* coneAttenuation        */   0.0,   0.0, false,
  1682.                 /* elevationDeg            */   0.0,   0.0, false,
  1683.                 /* azimuthDeg            */   0.0,   0.0, false,
  1684.                 /* distance                */   2.0,  10.0, true,
  1685.                 /* projectionAngleDeg    */   0.0,   0.0, false,
  1686.                 /* sourceVelocity        */   0.0,   0.0, false,
  1687.                 /* listenerVelocity        */   0.0,   0.0, false
  1688.         },
  1689.         { /* dividing line */ },
  1690.         { /* Source Doppler */
  1691.                 /* duration                */   4.0,
  1692.                 /* cpuLoad                */     0,     0, false,
  1693.                 /* medium                */ kSSpMedium_Air,
  1694.                 /* humidity                */   0.0,   0.0, false,
  1695.                 /* roomSize                */   0.0,   0.0, false,
  1696.                 /* roomReflectivity        */ -10.0,   0.0, false,
  1697.                 /* reverbAttenuation    */ -15.0,   0.0, false,
  1698.                 /* sourceMode            */ kSSpSourceMode_Localized,
  1699.                 /* referenceDistance    */   1.0,   0.0, false,
  1700.                 /* coneAngleDeg            */  90.0,   0.0, false,
  1701.                 /* coneAttenuation        */   0.0,   0.0, false,
  1702.                 /* elevationDeg            */   0.0,   0.0, false,
  1703.                 /* azimuthDeg            */   0.0,   0.0, false,
  1704.                 /* distance                */   1.0,   0.0, false,
  1705.                 /* projectionAngleDeg    */   0.0,   0.0, false,
  1706.                 /* sourceVelocity        */ -20.0,  20.0, true,
  1707.                 /* listenerVelocity        */   0.0,   0.0, false
  1708.         },
  1709.         { /* Listener Doppler */
  1710.                 /* duration                */   4.0,
  1711.                 /* cpuLoad                */     0,     0, false,
  1712.                 /* medium                */ kSSpMedium_Air,
  1713.                 /* humidity                */   0.0,   0.0, false,
  1714.                 /* roomSize                */   0.0,   0.0, false,
  1715.                 /* roomReflectivity        */ -10.0,   0.0, false,
  1716.                 /* reverbAttenuation    */ -15.0,   0.0, false,
  1717.                 /* sourceMode            */ kSSpSourceMode_Localized,
  1718.                 /* referenceDistance    */   1.0,   0.0, false,
  1719.                 /* coneAngleDeg            */  90.0,   0.0, false,
  1720.                 /* coneAttenuation        */   0.0,   0.0, false,
  1721.                 /* elevationDeg            */   0.0,   0.0, false,
  1722.                 /* azimuthDeg            */   0.0,   0.0, false,
  1723.                 /* distance                */   1.0,   0.0, false,
  1724.                 /* projectionAngleDeg    */   0.0,   0.0, false,
  1725.                 /* sourceVelocity        */   0.0,   0.0, false,
  1726.                 /* listenerVelocity        */ -20.0,  20.0, true
  1727.         },
  1728.         { /* Combined Doppler */
  1729.                 /* duration                */   4.0,
  1730.                 /* cpuLoad                */     0,     0, false,
  1731.                 /* medium                */ kSSpMedium_Air,
  1732.                 /* humidity                */   0.0,   0.0, false,
  1733.                 /* roomSize                */   0.0,   0.0, false,
  1734.                 /* roomReflectivity        */ -10.0,   0.0, false,
  1735.                 /* reverbAttenuation    */ -15.0,   0.0, false,
  1736.                 /* sourceMode            */ kSSpSourceMode_Localized,
  1737.                 /* referenceDistance    */   1.0,   0.0, false,
  1738.                 /* coneAngleDeg            */  90.0,   0.0, false,
  1739.                 /* coneAttenuation        */   0.0,   0.0, false,
  1740.                 /* elevationDeg            */   0.0,   0.0, false,
  1741.                 /* azimuthDeg            */   0.0,   0.0, false,
  1742.                 /* distance                */   1.0,   0.0, false,
  1743.                 /* projectionAngleDeg    */   0.0,   0.0, false,
  1744.                 /* sourceVelocity        */ -20.0,  20.0, true,
  1745.                 /* listenerVelocity        */ -20.0,  20.0, true
  1746.         },
  1747.         { /* Cancelled Doppler */
  1748.                 /* duration                */   4.0,
  1749.                 /* cpuLoad                */     0,     0, false,
  1750.                 /* medium                */ kSSpMedium_Air,
  1751.                 /* humidity                */   0.0,   0.0, false,
  1752.                 /* roomSize                */   0.0,   0.0, false,
  1753.                 /* roomReflectivity        */ -10.0,   0.0, false,
  1754.                 /* reverbAttenuation    */ -15.0,   0.0, false,
  1755.                 /* sourceMode            */ kSSpSourceMode_Localized,
  1756.                 /* referenceDistance    */   1.0,   0.0, false,
  1757.                 /* coneAngleDeg            */  90.0,   0.0, false,
  1758.                 /* coneAttenuation        */   0.0,   0.0, false,
  1759.                 /* elevationDeg            */   0.0,   0.0, false,
  1760.                 /* azimuthDeg            */   0.0,   0.0, false,
  1761.                 /* distance                */   1.0,   0.0, false,
  1762.                 /* projectionAngleDeg    */   0.0,   0.0, false,
  1763.                 /* sourceVelocity        */  20.0, -20.0, true,
  1764.                 /* listenerVelocity        */ -20.0,  20.0, true
  1765.         }
  1766.     };
  1767.     
  1768.     gTestLoLevelData = preset[index];
  1769.     
  1770.     TestLoLevel_DeriveData();
  1771.     TestLoLevel_SetDialogFields();
  1772. }
  1773.  
  1774.  
  1775.